package ch19 {
	/**
	 * 基于时间的动画
	 * 如果要让动画中物体的速度是一致的，那么基于时间的动画就是我们要使用的方法。这种方法在一些游戏中比较常用。我们知道，帧和计时器动画都不能以特定的速率播放。一个复杂的动画在一台又老又慢的电脑上运行可能要比最初设计的速度慢上许多。我们马上会看到，使用基于时间的动画无论最终动画运行的帧频如何，都将获得可靠的速度。
	   首先要改变考虑速度的方法。到目前为止，在我说 vx = 5 时，我们使用的单位是像素每帧（pixels per frame）。换句话讲，每进入新的一帧物体都将在 x 轴上运动 5 像素。在计时器动画中，当然，就应该是每次定时间隔移动 5 像素。
	   对于时间动画，我们将使用真正的时间单位，如秒。由于我们是处理完整的一秒，而非其中的一部分，因此这个速度值就要更大一些。如果某个物体的速度是每帧 10 像素，每秒30 帧的速度运动，大约每秒 300 像素。
       
       策略：在每帧的开始时调用 getTimer 计算与上一帧间隔了多长时间。如果将它除以 1,000，我们将得到以秒为单位的间隔时间，这是个以秒为单位的分数。由于我们的 vx 和 vy 现在是以像素每秒来计算的，因此可以让它们去乘以这个分数，这样就知道要对物体移动多少了。同样，不要忘记重新设置 time 变量的值，以便让下一帧进行计算。
测试一下，我们将看到小球移动的速度几乎与最初的速度相同！但是真正令人激动的是我们可以以任何帧频来发布这个影片，它仍然可以以同样的速度运动！通过修改stage.frameRate 的值，试验一下高到 1,000 fps，低到 10 fps，你会看到小球的速度是相同的。当然，较高的频率会让动画更加流畅，而较低的频率则会十分不连贯，但是速度是一致的。
	 * @author jianping.shenjp
	 */
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.utils.getTimer;
	import utils.Ball;

	public class TimeBased extends Sprite {
		private var ball:Ball;
		private var vx:Number;
		private var vy:Number;
		//private var bounce:Number = -0.7;
		private var bounce:Number = -1;
		private var time:Number;
        private var gravity:Number = 450; 


		public function TimeBased(){
			init();
		}

		private function init():void {
			stage.frameRate = 60;
			ball = new Ball();
			ball.x = stage.stageWidth / 2;
			ball.y = stage.stageHeight / 2;
			vx = 300;
			vy = -300;
			addChild(ball);
			time = getTimer();
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}

		private function onEnterFrame(event:Event):void {
            trace("stage.frameRate:",stage.frameRate);
			var elapsed:Number = getTimer() - time;
			trace("elapsed:",elapsed);
			time = getTimer();
            vy += gravity * elapsed / 1000;
			ball.x += vx * elapsed / 1000;
			ball.y += vy * elapsed / 1000;
			var left:Number = 0;
			var right:Number = stage.stageWidth;
			var top:Number = 0;
			var bottom:Number = stage.stageHeight;
			if (ball.x + ball.radius > right){
				ball.x = right - ball.radius;
				vx *= bounce;
			} else if (ball.x - ball.radius < left){
				ball.x = left + ball.radius;
				vx *= bounce;
			}
			if (ball.y + ball.radius > bottom){
				ball.y = bottom - ball.radius;
				vy *= bounce;
			} else if (ball.y - ball.radius < top){
				ball.y = top + ball.radius;
				vy *= bounce;
			}
		}
	}

}